package guida.ccf.gzuexaminesystem.expression;

import guida.ccf.gzuexaminesystem.common.Bucket;
import guida.ccf.gzuexaminesystem.dto.StudentSaveFileDto;
import guida.ccf.gzuexaminesystem.entity.minio.DeleteFileDto;
import guida.ccf.gzuexaminesystem.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class AuthorityUtils {

    /**
     * 从 DeleteFileDto 的属性中提取出其中包含的权限信息，并将其组合为权限字符串列表
     *
     * @param list DeleteFileDto 集合
     * @return 包含权限字符串的列表
     */
    public static List<String> getAuthoritiesByList(List<DeleteFileDto> list, String token, String bucket) {

        // 从 token 中获取学号或工号.
        try {
            Claims claims = JwtUtil.parseJWT(token);
            String userId = claims.get("userId").toString();
            String authority = claims.get("roleType").toString();

            List<String> authorities = new ArrayList<>();
            for (DeleteFileDto dto : list) {
                String url = dto.getFolder();
                // 文件路径包含登录的用户id(学号/工号)
                if (url.contains(userId) && bucket.equals(dto.getBucket())) {
                    // 添加权限信息
                    authorities.add(authority);
                }
            }
            return authorities;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    /**
     *  学生上传文件的自定义权限
     */
    public static List<String> studentUploadFile(StudentSaveFileDto fileDto, String token) {
        try {
            Claims claims = JwtUtil.parseJWT(token);
            // 拿到学号
            String studentId = claims.get("userId").toString();

            // 校验: 学生只能上传到自己的目录.
            if (!fileDto.getStudentId().equals(studentId)) {
                // 不满足要求, 返回空数组, 即没有权限.
                return new ArrayList<>();
            }

            // 拿到权限信息
            String authority = claims.get("roleType").toString();
            // 返回数组形式的权限信息
            return Collections.singletonList(authority);

        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }


    /**
     *  学生上传文件的自定义权限
     */
    public static List<String> commonAuthorities(String studentId, String token) {
        try {
            Claims claims = JwtUtil.parseJWT(token);
            // 拿到学号
            String userId = claims.get("userId").toString();

            // 校验: 学生只能上传到自己的目录.
            if (!studentId.equals(userId)) {
                // 不满足要求, 返回空数组, 即没有权限.
                return new ArrayList<>();
            }

            // 拿到权限信息
            String authority = claims.get("roleType").toString();
            // 返回数组形式的权限信息
            return Collections.singletonList(authority);

        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
}